
package mx.com.ingsw.service;


import java.security.NoSuchAlgorithmException;
import java.util.List;
import mx.com.ingsw.dao.AlumnoDAO;
import mx.com.ingsw.dao.AsignaturaDAO;
import mx.com.ingsw.dao.exceptions.NonexistentEntityException;
import mx.com.ingsw.model.Alumno;
import mx.com.ingsw.model.Asignatura;
import mx.com.ingsw.model.Historial;
import mx.com.ingsw.query.AlumnoQuery;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service("ServiceAdministracion")
@Scope("request")

public class ServiceAdministracion {
 

    int cuenta;
    int credito;
    int cont = 1;
    double sumcalif;
    double indice;
    double prom;
    
    public String genera() throws NonexistentEntityException, Exception {
        //extraer el promedio
            AlumnoDAO dal = new AlumnoDAO();
            List<Alumno> listaal = dal.findAlumnoEntities();
            ServiceAdministracion ni[] = new ServiceAdministracion[listaal.size()];
            //ServiceAdministracion ni2[] = new ServiceAdministracion[listaal.size()];
            //Llenando table
            for (int i = 0; i < listaal.size(); i++) {
                ni[i] =Llenado(listaal.get(i).getNoCuenta());}
            
            ni=ordena(ni);
            for (int i = 0; i < ni.length; i++){
                Alumno alu=dal.read(ni[i].cuenta);
                alu.setNoInscripcion(i);
         //       alu.setPromedio((float)ni[i].indice);
                dal.update(alu);
            }
            return "Exito";
    }

    public ServiceAdministracion[] ordena(ServiceAdministracion[] ni) {
        ServiceAdministracion aux;
        int n = ni.length;
        //System.out.println("el tamaño es "+n);
        for (int i = n - 1; i >= 0; i--) {
            for (int j = 0; j < i; j++) {
                if (ni[j].indice < ni[j + 1].indice) {
                    aux = ni[j];
                    ni[j] = ni[j + 1];
                    ni[j + 1] = aux;
                }
            }
        }
        return ni;
    }

    public double promedio(int cuenta) throws NoSuchAlgorithmException {
//consultando a la base
        Alumno albd = new Alumno();
        AlumnoDAO da = new AlumnoDAO();
        albd = da.read(cuenta);
        if (albd == null) {
            return -1;
        }
        return albd.getPromedio();
    }

    public ServiceAdministracion Llenado(int cuenta) throws NoSuchAlgorithmException {
       
        Asignatura as = new Asignatura();
        AsignaturaDAO das = new AsignaturaDAO();
        AlumnoQuery aq = new AlumnoQuery();
        int sumador = 0;
        double SumCalif = 0;
        
        List<Historial> listaH = aq.getAsignaturaCreditos(cuenta);
        ServiceAdministracion ni = new ServiceAdministracion();
        for (int i = 0; i < listaH.size(); i++) {
            if (listaH.get(i).getEstado() == 4) {
         
                //das.read(listaH.get(i).getHistorialPK().getIdAsignatura()).getCreditos();
                
                sumador +=listaH.get(i).getHistorialPK().getIdAsignatura();
                SumCalif += listaH.get(i).getPromedio();
            }
        }
        ni.cuenta = cuenta;
        ni.credito = sumador;
        ni.sumcalif =SumCalif;
        ni.prom = ni.promedio(cuenta);
        ni.indice =(ni.prom * ni.credito * ni.sumcalif) / 3;

        return ni;
    }

    public int Calificacion(int cuenta) {
        Asignatura as = new Asignatura();
        AsignaturaDAO das = new AsignaturaDAO();
        AlumnoQuery aq = new AlumnoQuery();
        int sumador = 0;
        List<Historial> listaH = aq.getAsignaturaCreditos(cuenta);
        for (int i = 0; i < listaH.size(); i++) {
            if (listaH.get(i).getEstado() == 4) {
                as = das.read(listaH.get(i).getHistorialPK().getIdAsignatura());
                sumador += as.getCreditos();
                cont++;
            }
        }
        return sumador;
    }

//Falta núumero de inscripción en la base de datos

    public String ImprimeNI(ServiceAdministracion[] ni, int i) {
        if (ni.length == i) {
            return "";
        }
        return ni[i].cuenta + " " + ni[i].indice + " \n" + ImprimeNI(ni, i + 1);

    }
}